package br.ufrn.sipac.patrimonio.coletor.activity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import br.ufrn.sipac.patrimonio.auxiliares.ConstantesOperacoes;
import br.ufrn.sipac.patrimonio.coletor.R;
import br.ufrn.sipac.patrimonio.coletor.controller.AutenticacaoController;
import br.ufrn.sipac.patrimonio.coletor.controller.LevantamentoController;
import br.ufrn.sipac.patrimonio.coletor.controller.MainController;
import br.ufrn.sipac.patrimonio.coletor.dominio.UsuarioColetor;
import br.ufrn.sipac.patrimonio.coletor.exception.DatabaseException;
import br.ufrn.sipac.patrimonio.coletor.exception.NegocioException;
import br.ufrn.sipac.patrimonio.coletor.exception.TransmissaoException;

/**
 * Activity responsável por processar requisições associadas a janela inicial da
 * aplicação. As operações disponíveis para o usuário são a autenticação no
 * sistema ou entrar no modo offline.
 * 
 * @author Giuliana Silva Bezerra
 * 
 */
public class AutenticacaoActivity extends Activity {
	/** Botão utilizado para autenticação no sistema. */
	private Button entrar;
	/** Botão utilizado para operar em modo offline no sistema. */
	private Button offline;
	private static EditText login;
	private static EditText senha;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_autenticacao);
		// Mapear os componente da tela
		entrar = (Button) findViewById(R.id.button1);
		offline = (Button) findViewById(R.id.button2);
		login = (EditText) findViewById(R.id.editText1);
		senha = (EditText) findViewById(R.id.editText2);
		// Adicionar listeners
		entrar.setOnClickListener(new AutenticacaoListener());
		offline.setOnClickListener(new AutenticacaoOfflineListener());
		login.requestFocus();

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.autenticacao, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.item2:
			iniciaMenu();
		case R.id.item1:
			finish();
		}
		return false;
	}

	/**
	 * Chama o método responsável pela autenticação no sistema.
	 * 
	 * @throws NegocioException
	 */
	public void logar() throws NegocioException {
		// Recuperar login e senha fornecidos
		String login = AutenticacaoActivity.getLogin();
		String senha = AutenticacaoActivity.getSenha();

		MainController.setTipoOperacao(ConstantesOperacoes.MODO_ONLINE);
		MainController.setTipoAutenticacao(ConstantesOperacoes.MODO_ONLINE);
		AutenticacaoController.setLogin(login);
		AutenticacaoController.setSenha(senha);

		try {
			boolean autenticado = AutenticacaoController.logar(this);
			if (!autenticado)
				throw new NegocioException("Login/Senha inválido(s)", this);
			else {
				/**
				 * Nesse momento se faz uma requisição ao servidor buscando as
				 * unidades que o usuário do coletor tem permissão para realizar
				 * o levantamento.
				 */

				AutenticacaoController.findUnidadesPermissao(this);

				/**
				 * Outra requisição ao servidor para buscar os dados referentes
				 * ao usuário conectado no coletor para popular o levantamento.
				 */
				UsuarioColetor usu;

				usu = MainController.capturarUsuario(login.trim(), this);
				LevantamentoController.getInstance().getLevantamento().setUsuario(usu);
				iniciaMenu();
			}
		} catch (DatabaseException e) {
		} catch (TransmissaoException e) {
		}
	}

	/**
	 * Sistema em modo offline.
	 */
	public void logarOffline() {
		LevantamentoController.getInstance().getLevantamento().setUsuario(new UsuarioColetor(0));
		MainController.setTipoOperacao(ConstantesOperacoes.MODO_OFFLINE);
		MainController.setTipoAutenticacao(ConstantesOperacoes.MODO_OFFLINE);
		iniciaMenu();
	}

	/**
	 * Carrega menu da aplicação.
	 */
	private void iniciaMenu() {
		finish();
		Intent intent = new Intent(this, MenuActivity.class);
		startActivity(intent);
	}

	public static String getLogin() {
		return login.getText().toString();
	}

	public static String getSenha() {
		return senha.getText().toString();
	}

	/************************************ Listeners ******************************************************/

	/**
	 * Listener que lida com solicitação de autenticação.
	 */
	public class AutenticacaoListener implements Button.OnClickListener {
		@Override
		public void onClick(View arg0) {
			try {
				logar();
			} catch (NegocioException e) {
			}
		}
	}

	/**
	 * Listener que carrega o modo offline da aplicação.
	 */
	public class AutenticacaoOfflineListener implements Button.OnClickListener {
		@Override
		public void onClick(View arg0) {
			logarOffline();
		}
	}

	@Override
	public void onBackPressed() {
		// Desabilita botão voltar.
	}
}
